﻿// CPopMic.cpp: 实现文件
//

#include "pch.h"
#include "DntDemo.h"
#include "afxdialogex.h"
#include "CPopMic.h"
#include "FwbLog.h"
#include "CTabAudioKc3x.h"
#define TAG	"CPopMic"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 标准C语言函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CPopMic* mCPopMic = NULL;

static void changRegCallback() {
	if (mCPopMic != NULL) {
		mCPopMic->ShowRegister();
	}
}

int CPopMic::ShowSlider(uint8_t value, int slider, int edit) {			// 显示数值
	CString text;
	text.Format(L"%d", value);
	((CStatic*)GetDlgItem(edit))->SetWindowText(text);
	return value;
}

void CPopMic::SetMicValue(int slider, int edit) {						// 读取选项的状态值
	int position = ((CSliderCtrl*)GetDlgItem(slider))->GetPos();
	uint8_t value = 0;
	switch (slider) {
	case IDC_SLIDER_MUSIC:					// 音乐
		value = position & 0x0f;
		gMicValue[0] &= ~0x0f;				// B4:B7保留原数值
		gMicValue[0] |= value;
		break;
	case IDC_SLIDER_MIC1_VOL:				// 话筒1
		value = position << 4;				// 往前移动4位
		gMicValue[1] &= ~0xf0;				// B0:B3保留原数值
		gMicValue[1] |= value;
		break;
	case IDC_SLIDER_MIC2_VOL:				// 话筒2
		value = position & 0x0f;
		gMicValue[1] &= ~0x0f;				// B4:B7保留原数值
		gMicValue[1] |= value;
		break;
	case IDC_SLIDER_ECHO:					// 回声比例
		value = position & 0x0f;
		gMicValue[2] &= ~0x0f;				// B4:B7保留原数值
		gMicValue[2] |= value;
		break;
	case IDC_SLIDER_REPEAT:					// 重复比例
		value = position & 0x0f;
		gMicValue[3] &= ~0x0f;				// B4:B7保留原数值
		gMicValue[3] |= value;
		break;
	case IDC_SLIDER_DELAY_TIME:				// 延迟时间
		value = position << 4;				// 往前移动4位
		gMicValue[3] &= ~0xf0;				// B0:B3保留原数值
		gMicValue[3] |= value;
		break;
	}
	ShowSlider(position, slider, edit);
	gSlowTime = 3;
}

int CPopMic::ShowMicEqSlider(uint16_t value, int slider, int top, int bottom) {		// 显示数值
	CString text;
	const int tabStep[] = { 5,50,100,500 };		// 每步的频率值
	int step = tabStep[(value >> 5) & 0x03];	// 每步的频率值
	int temp = step * (value & 0x1f);			// 频率值	(value & 0x1f)为步数
	int digit = (value >> 8) & 0x0f;			// 显示的数值
	int digitA = (value >> 7) & 0x01;			// 查看正负数

	if (top != -1) {
		text.Format(L"%dHz", temp);								// 频率数值显示
		((CStatic*)GetDlgItem(top))->SetWindowText(text);		// 频率数值显示
	}
	if (getIsEq()) {													// EQ调节	
		if (slider == IDC_SLIDER_MIC_TREBLE || slider == IDC_SLIDER_MIC_BASS || bottom == IDC_MIC_TREBLE || bottom == IDC_MIC_BASS) {
			((CStatic*)GetDlgItem(slider))->EnableWindow(false);		// 不能滑动滑块
		}
		else {
			((CStatic*)GetDlgItem(slider))->EnableWindow(true);			// 能滑动滑块
			if (digitA == 0) {											// 显示正数
				text.Format(L"%d", digit);								// 显示正数	
				((CStatic*)GetDlgItem(bottom))->SetWindowText(text);
				if ((mKc3x->Brightness >> 4) == 4){						// LCD面板
					return (15 - digit);								// 滑块显示位置
				}
				else {													// LED面板
					return (9 - digit);									// 滑块显示位置
				}
			}
			else {														// 显示负数
				text.Format(L"%d", digit * (-1));						// 显示负数
				((CStatic*)GetDlgItem(bottom))->SetWindowText(text);
				if ((mKc3x->Brightness >> 4) == 4) {					// LCD面板
					return (15 + digit);								// 滑块显示位置
				}
				else {													// LED面板
					return (9 + digit);									// 滑块显示位置
				}
			}
		}
	}
	else {																// MIC高低音调节
		if (slider == IDC_SLIDER_MIC_TREBLE || slider == IDC_SLIDER_MIC_BASS || bottom == IDC_MIC_TREBLE || bottom == IDC_MIC_BASS) {
			((CStatic*)GetDlgItem(IDC_SLIDER_EQ_1))->EnableWindow(false);		// 不能滑动滑块
			((CStatic*)GetDlgItem(IDC_SLIDER_EQ_2))->EnableWindow(false);		// 不能滑动滑块
			((CStatic*)GetDlgItem(IDC_SLIDER_EQ_3))->EnableWindow(false);		// 不能滑动滑块
			((CStatic*)GetDlgItem(IDC_SLIDER_EQ_4))->EnableWindow(false);		// 不能滑动滑块
			((CStatic*)GetDlgItem(IDC_SLIDER_EQ_5))->EnableWindow(false);		// 不能滑动滑块

			((CStatic*)GetDlgItem(slider))->EnableWindow(true);			// 能滑动滑块
			if (digitA == 0) {											// 显示正数
				text.Format(L"%d", digit);								// 显示正数	
				((CStatic*)GetDlgItem(bottom))->SetWindowText(text);
				if ((mKc3x->Brightness >> 4) == 4) {					// LCD面板
					return (15 + digit);								// 滑块显示位置
				}
				else {													// LED面板
					return (9 + digit);									// 滑块显示位置
				}
			}
			else {														// 显示负数
				text.Format(L"%d", digit * (-1));						// 显示负数
				((CStatic*)GetDlgItem(bottom))->SetWindowText(text);
				if ((mKc3x->Brightness >> 4) == 4) {					// LCD面板
					return (15 - digit);								// 滑块显示位置
				}
				else {													// LED面板
					return (9 - digit);									// 滑块显示位置
				}
			}
		}
		else {
			((CStatic*)GetDlgItem(slider))->EnableWindow(false);		// 不能滑动滑块
		}
	}
	return 0;
}

void CPopMic::SetMicEQ(int slider, int top, int bottom, int index) {		// 读取选项的状态值
	int position = ((CSliderCtrl*)GetDlgItem(slider))->GetPos();
	uint16_t value;
	int offset;
	switch (index) {
		case 0:		// EQ第一列
		case 1:		// EQ第二列
		case 6:		// MIC低音
		case 7:		// MIC高音
			offset = 5;
			break;
		case 2:		// EQ第三列
		case 3:		// EQ第四列
			offset = 8;
			break;
		default:	// EQ第五列
			offset = 11;
			break;
	}

	if ((index & 1) == 0) {									// 奇段的1-3-5
		value = mKc3x->Eq3[offset];							// 这段低8位（B7:0）
		value |= (mKc3x->Eq3[offset + 2] & 0x0f) << 8;		// 这段高4位（B11:8）
	}
	else {													// 偶段的2-4
		value = mKc3x->Eq3[offset+1];						// 这段低8位（B7:0）
		value |= (mKc3x->Eq3[offset + 2] >> 4) << 8;		// 这段高4位（B11:8）
	}

	if (index == 6 || index == 7) {
		if ((mKc3x->Brightness >> 4) == 4) {				// LCD面板
			if (position >= 15) {							// 显示正数
				value &= 0x07f;
				value |= ((position - 15) << 8);
			}
			else {											// 显示负数	
				value &= 0x07f;
				value |= (15 - position) << 8;
				value |= 0x80;								// 0x80表示为负数的意思	
			}
		}
		else {												// LED面板
			if (position >= 9) {							// 显示正数
				value &= 0x07f;
				value |= ((position - 9) << 8);
			}
			else {											// 显示负数	
				value &= 0x07f;
				value |= (9 - position) << 8;
				value |= 0x80;								// 0x80表示为负数的意思	
			}
		}
	}
	else {
		if ((mKc3x->Brightness >> 4) == 4) {				// LCD面板
			if (position >= 16) {							// 显示负数	
				value &= 0x07f;
				value |= ((position - 15) << 8);
				value |= 0x80;								// 0x80表示为负数的意思		
			}
			else {											// 显示正数
				value &= 0x07f;
				value |= (15 - position) << 8;
			}
		}
		else {												// LED面板
			if (position >= 9) {							// 显示负数	
				value &= 0x07f;
				value |= ((position - 9) << 8);
				value |= 0x80;								// 0x80表示为负数的意思		
			}
			else {											// 显示正数
				value &= 0x07f;
				value |= (9 - position) << 8;
			}
		}
	}

	uint8_t level = value >> 8;												// 向右移8位，得到b11-b8的数值
	if ((index & 1) == 0) {													// 奇段的1-3-5
		gMicEqValue[offset] = (uint8_t)value;								// 奇段低8位（B7:0）
		gMicEqValue[offset + 2] = mKc3x->Eq3[offset + 2] & 0xf0;			// 字节高4位（要保留偶段字节的高4位）（B11:8）
		gMicEqValue[offset + 2] |= level;									// 字节低4位（变成奇段高4位）（B11:8）
	}
	else {																	// 偶数列的2-4
		gMicEqValue[offset + 1] = (uint8_t)value;							// 偶段低8位（B7:0）
		gMicEqValue[offset + 2] = mKc3x->Eq3[offset + 2] & 0x0f;			// 字节低4位（要保留奇段字节的高4位）（B11:8）
		gMicEqValue[offset + 2] |= level << 4;								// 字节高4位（向右移4位，变成偶段高4位）（B11:8）
	}
	ShowMicEqSlider(value, slider, top, bottom);
	gEqSlowTime = 3;
}

void CPopMic::ShowRegister() {
	if (gSaveEq != getIsEq()) {
		CLOGI(TAG, "ShowRegister EQ调节的标志的数值AA (%02x)(%02x)(%02x)", gSaveEq, getIsEq(), gMicEqValue[3]);
		gSaveEq = getIsEq();
		((CStatic*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->EnableWindow(false);	// 不能滑动滑块
		((CStatic*)GetDlgItem(IDC_SLIDER_MIC_BASS))->EnableWindow(false);	// 不能滑动滑块
		((CButton*)GetDlgItem(IDC_RADIO_EQ_OPEN))->SetCheck(getIsEq());		// 显示EQ调节是否被选中
		((CButton*)GetDlgItem(IDC_RADIO_MIC_OPEN))->SetCheck(!getIsEq());	// 显示EQ调节是否被选中
		if (getIsEq()) {						// EQ调节
			gMicEqValue[3] &= 0x3f;				// B5:B0保留原数值
			gMicEqValue[3] |= 0x00;				// B7:B6 的B6为0
		}
		else {									// 高低音调节
			gMicEqValue[3] &= 0x3f;				// B5:B0保留原数值
			gMicEqValue[3] |= 0x40;				// B7:B6 的B6为1
		}
		CLOGI(TAG, "ShowRegister EQ调节的标志的数值TT (%02x)(%02x)(%02x)", gSaveEq, getIsEq(), gMicEqValue[3]);
	}
	
	static const int tabSliderIds[] = {
		IDC_SLIDER_EQ_1, IDC_SLIDER_EQ_2,
		IDC_SLIDER_EQ_3, IDC_SLIDER_EQ_4,
		IDC_SLIDER_EQ_5, -1,
	};
	static const int taTopIds[] = {
		IDC_EQ1_HZ, IDC_EQ2_HZ,
		IDC_EQ3_HZ, IDC_EQ4_HZ,
		IDC_EQ5_HZ, -1,
	};
	static const int tabBottomIds[] = {
		IDC_STATIC_EQ1_VALUE, IDC_STATIC_EQ2_VALUE,
		IDC_STATIC_EQ3_VALUE, IDC_STATIC_EQ4_VALUE,
		IDC_STATIC_EQ5_VALUE, -1,
	};
	int offset = 5;
	bool isMove = gEqSlowTime > 0 ? true : false;
	if (getIsEq()){					// EQ调节		
		for (int index = 0; index < 5; index += 2) {
			uint16_t odd = mKc3x->Eq3[offset] | (mKc3x->Eq3[offset + 2] & 0x0f) << 8;		// 奇段数值
			uint16_t even = mKc3x->Eq3[offset + 1] | (mKc3x->Eq3[offset + 2] >> 4) << 8;	// 偶段数值
			odd &= 0x0fff;
			even &= 0x0fff;
			if (tabSliderIds[index] != -1 && taTopIds[index] != -1 && tabBottomIds[index] != -1) {
				int position7 = ShowMicEqSlider(odd, tabSliderIds[index], taTopIds[index], tabBottomIds[index]);
				if (!isMove || gIsClick) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动  gIsClick是点击选择EQ调节还是高低音调节的标志
					((CSliderCtrl*)GetDlgItem(tabSliderIds[index]))->SetPos(position7);
				}
			}
			if (tabSliderIds[index + 1] != -1 && taTopIds[index] != -1 && tabBottomIds[index] != -1) {
				int position8 = ShowMicEqSlider(even, tabSliderIds[index + 1], taTopIds[index + 1], tabBottomIds[index + 1]);
				if (!isMove || gIsClick) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动  gIsClick是点击选择EQ调节还是高低音调节的标志
					((CSliderCtrl*)GetDlgItem(tabSliderIds[index + 1]))->SetPos(position8);
				}
			}
			offset += 3;
		}
		gIsClick = false;	  // 取消点击选择EQ调节还是高低音调节的标志
	}
	else {					// MIC高低音调节
		uint16_t odd = mKc3x->Eq3[offset] | (mKc3x->Eq3[offset + 2] & 0x0f) << 8;			// 奇段数值
		uint16_t even = mKc3x->Eq3[offset + 1] | (mKc3x->Eq3[offset + 2] >> 4) << 8;		// 偶段数值
		odd &= 0x0fff;
		even &= 0x0fff;

		int position9 = ShowMicEqSlider(odd, IDC_SLIDER_MIC_BASS, -1, IDC_MIC_BASS);			// MIC低音
		if (!isMove || gIsClick) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动  gIsClick是点击选择EQ调节还是高低音调节的标志
			((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_BASS))->SetPos(position9);
		}
		int position10 = ShowMicEqSlider(even, IDC_SLIDER_MIC_TREBLE, -1, IDC_MIC_TREBLE);		// MIC高音
		if (!isMove || gIsClick) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动  gIsClick是点击选择EQ调节还是高低音调节的标志
			((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->SetPos(position10);
		}
		gIsClick = false;	  // 取消点击选择EQ调节还是高低音调节的标志
	}
	
	int position1 = ShowSlider((mKc3x->MicVolume >> 4), IDC_SLIDER_MIC1_VOL, IDC_MIC1_VOL);
	int position2 = ShowSlider((mKc3x->MicVolume & 0x0f), IDC_SLIDER_MIC2_VOL, IDC_MIC2_VOL);
	int position3 = ShowSlider((mKc3x->MicEcho & 0x0f), IDC_SLIDER_ECHO, IDC_ECHO_VALUE);
	int position4 = ShowSlider((mKc3x->MicDelay >> 4), IDC_SLIDER_DELAY_TIME, IDC_DELAY_TIME_VALUE);
	int position5 = ShowSlider((mKc3x->MicDelay & 0x0f), IDC_SLIDER_REPEAT, IDC_REPEAT_VALUE);
	int position6 = ShowSlider((mKc3x->MicMixer & 0x0f), IDC_SLIDER_MUSIC, IDC_MUSIC_VALUE);
	if (gSlowTime == 0) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC1_VOL))->SetPos(position1);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC2_VOL))->SetPos(position2);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_ECHO))->SetPos(position3);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_DELAY_TIME))->SetPos(position4);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_REPEAT))->SetPos(position5);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MUSIC))->SetPos(position6);
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// C++语言对话框函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// CPopMic 对话框

IMPLEMENT_DYNAMIC(CPopMic, CDialogEx)

CPopMic::CPopMic(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_POP_MIC, pParent){
}

CPopMic::~CPopMic(){
}

void CPopMic::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CPopMic, CDialogEx)
	ON_WM_TIMER()
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_MIC1_VOL, &CPopMic::OnNMCustomdrawSliderMic1Vol)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_MIC2_VOL, &CPopMic::OnNMCustomdrawSliderMic2Vol)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_ECHO, &CPopMic::OnNMCustomdrawSliderEcho)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_DELAY_TIME, &CPopMic::OnNMCustomdrawSliderDelayTime)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_REPEAT, &CPopMic::OnNMCustomdrawSliderRepeat)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_MUSIC, &CPopMic::OnNMCustomdrawSliderMusic)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_EQ_1, &CPopMic::OnNMCustomdrawSliderEq1)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_EQ_2, &CPopMic::OnNMCustomdrawSliderEq2)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_EQ_3, &CPopMic::OnNMCustomdrawSliderEq3)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_EQ_4, &CPopMic::OnNMCustomdrawSliderEq4)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_EQ_5, &CPopMic::OnNMCustomdrawSliderEq5)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_MIC_BASS, &CPopMic::OnNMCustomdrawSliderMicBass)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_MIC_TREBLE, &CPopMic::OnNMCustomdrawSliderMicTreble)
	ON_BN_CLICKED(IDC_RADIO_EQ_OPEN, &CPopMic::OnBnClickedRadioEqOpen)
	ON_BN_CLICKED(IDC_RADIO_MIC_OPEN, &CPopMic::OnBnClickedRadioMicOpen)

END_MESSAGE_MAP()

// CPopMic 消息处理程

BOOL CPopMic::OnInitDialog(){
	CDialogEx::OnInitDialog();
	// TODO:  在此添加额外的初始化

	if ((mKc3x->Brightness >> 4) == 4) {		// LCD面板(用亮度的最大值区分是什么屏幕)
		CString text;
		text.Format(L"%d", 15);
		((CStatic*)GetDlgItem(IDC_MIC_BASS))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_MIC_TREBLE))->SetWindowText(text);

		((CStatic*)GetDlgItem(IDC_STATIC_EQ_TEXT_9B))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_MIC_TEXT_9B))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_15_A))->SetWindowText(text);

		text.Format(L"%d", -15);		
		((CStatic*)GetDlgItem(IDC_STATIC_EQ_TEXT_9A))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_MIC_TEXT_9A))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_15_C))->SetWindowText(text);

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_1))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_2))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_3))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_4))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_5))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_1))->SetRange(0, 30);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_2))->SetRange(0, 30);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_3))->SetRange(0, 30);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_4))->SetRange(0, 30);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_5))->SetRange(0, 30);	// 设置最小值和最大值

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_BASS))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->SetTicFreq(15);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_BASS))->SetRange(0, 30);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->SetRange(0, 30);	// 设置最小值和最大值

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC1_VOL))->SetRange(0, 15);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC2_VOL))->SetRange(0, 15);	// 设置最小值和最大值 
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_ECHO))->SetRange(0, 15);		// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_DELAY_TIME))->SetRange(0, 15);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_REPEAT))->SetRange(0, 15);		// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MUSIC))->SetRange(0, 15);		// 设置最小值和最大值
	}
	else {										// LED面板
		CString text;
		text.Format(L"%d", 9);
		((CStatic*)GetDlgItem(IDC_MIC_BASS))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_MIC_TREBLE))->SetWindowText(text);

		((CStatic*)GetDlgItem(IDC_STATIC_EQ_TEXT_9B))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_MIC_TEXT_9B))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_15_A))->SetWindowText(text);

		text.Format(L"%d", -9);
		((CStatic*)GetDlgItem(IDC_STATIC_EQ_TEXT_9A))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_MIC_TEXT_9A))->SetWindowText(text);
		((CStatic*)GetDlgItem(IDC_STATIC_15_C))->SetWindowText(text);

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_1))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_2))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_3))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_4))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_5))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_1))->SetRange(0, 18);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_2))->SetRange(0, 18);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_3))->SetRange(0, 18);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_4))->SetRange(0, 18);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_EQ_5))->SetRange(0, 18);	// 设置最小值和最大值

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_BASS))->SetTicFreq(9);		// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->SetTicFreq(9);	// 设置每x个刻度显示一个间隔刻度线(需要在属性“外观”打开“打勾标记”和“自动打勾”)

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_BASS))->SetRange(0, 18);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC_TREBLE))->SetRange(0, 18);	// 设置最小值和最大值

		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC1_VOL))->SetRange(0, 9);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MIC2_VOL))->SetRange(0, 9);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_ECHO))->SetRange(0, 9);		// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_DELAY_TIME))->SetRange(0, 9);	// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_REPEAT))->SetRange(0, 9);		// 设置最小值和最大值
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_MUSIC))->SetRange(0, 9);		// 设置最小值和最大值
	}

	mCPopMic = this;
	isPopKc3xRegi = false;
	gEqSlowTime = 0;
	gSlowTime = 0;

	memset(gMicValue, 0, sizeof(gMicValue));
	memset(gMicEqValue, 0, sizeof(gMicEqValue));

	gSaveEq = getIsEq() ^ 1;
	ShowRegister();

	memcpy(gMicValue, &mKc3x->MicMixer, sizeof(gMicValue));		// 复制&mKc3x->MicMixer的数据到gMicValue中
	memcpy(gMicEqValue, mKc3x->Eq3, sizeof(gMicEqValue));		// 复制mKc3x->Eq3的数据到gMicEqValue中

	TestChangRegCallback(changRegCallback);
	SetTimer(1, 300, NULL);
	return TRUE;
	// 异常: OCX 属性页应返回 FALSE
}

void CPopMic::OnTimer(UINT_PTR nIDEvent) {
	if (memcmp(&mKc3x->MicMixer, gMicValue, sizeof(gMicValue))) {		// 如果判断&mKc3x->MicMixer与gMicValue数据不同
		memcpy(&mKc3x->MicMixer, gMicValue, sizeof(gMicValue));			// 把数据gMicValue复制到&mKc3x->MicVolume中
		isPopKc3xRegi = true;											// 允许写入寄存器的标志
	}
	if (memcmp(mKc3x->Eq3, gMicEqValue, sizeof(gMicEqValue))) {			// 如果判断数据不同
		memcpy(mKc3x->Eq3, gMicEqValue, sizeof(gMicEqValue));			// 把数据gMicEqValue复制到mKc3x->Eq3中
		isPopKc3xRegi = true;
	}
	
	if (isPopKc3xRegi) {
		isPopKc3xRegi = false;
		uint8_t save[6];
		uint8_t EqSave[16];
		memcpy(save, gMicValue, sizeof(gMicValue));				// 把gMicValue复制到save中，防止拉动滑块过程中数值反复跳动
		memcpy(EqSave, gMicEqValue, sizeof(gMicEqValue));		// 把gMicEqValue复制到EqSave中，防止拉动滑块过程中数值反复跳动
		ShowRegister();
		memcpy(gMicValue, save, sizeof(gMicValue));				// 把save复制到gMicValue中，防止拉动滑块过程中数值反复跳动
		memcpy(gMicEqValue, EqSave, sizeof(gMicEqValue));		// 把EqSave复制到gMicEqValue中，防止拉动滑块过程中数值反复跳动
		DntRegWrite();											// 写寄存器
	}
	
	if (gEqSlowTime) {
		--gEqSlowTime;
	}

	if (gSlowTime) {
		--gSlowTime;
	}
	
	CDialogEx::OnTimer(nIDEvent);
}

void CPopMic::OnNMCustomdrawSliderMic1Vol(NMHDR* pNMHDR, LRESULT* pResult){			// 麦克风1音量调节
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_MIC1_VOL, IDC_MIC1_VOL);	
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderMic2Vol(NMHDR* pNMHDR, LRESULT* pResult){			// 麦克风2音量调节
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_MIC2_VOL, IDC_MIC2_VOL);
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEcho(NMHDR* pNMHDR, LRESULT* pResult) {			// 回声比例
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_ECHO, IDC_ECHO_VALUE);
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderDelayTime(NMHDR* pNMHDR, LRESULT* pResult) {		// 延迟时间调节
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_DELAY_TIME, IDC_DELAY_TIME_VALUE);
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderRepeat(NMHDR* pNMHDR, LRESULT* pResult) {			// 重复比例
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_REPEAT, IDC_REPEAT_VALUE);
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderMusic(NMHDR* pNMHDR, LRESULT* pResult) {			// 音乐
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetMicValue(IDC_SLIDER_MUSIC, IDC_MUSIC_VALUE);
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEq1(NMHDR* pNMHDR, LRESULT* pResult){
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (getIsEq()) {
		SetMicEQ(IDC_SLIDER_EQ_1, IDC_EQ1_HZ, IDC_STATIC_EQ1_VALUE, 0);				// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEq2(NMHDR* pNMHDR, LRESULT* pResult){
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (getIsEq()) {
		SetMicEQ(IDC_SLIDER_EQ_2, IDC_EQ2_HZ, IDC_STATIC_EQ2_VALUE, 1);				// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEq3(NMHDR* pNMHDR, LRESULT* pResult){
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (getIsEq()) {
		SetMicEQ(IDC_SLIDER_EQ_3, IDC_EQ3_HZ, IDC_STATIC_EQ3_VALUE, 2);				// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEq4(NMHDR* pNMHDR, LRESULT* pResult){
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (getIsEq()) {
		SetMicEQ(IDC_SLIDER_EQ_4, IDC_EQ4_HZ, IDC_STATIC_EQ4_VALUE, 3);				// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderEq5(NMHDR* pNMHDR, LRESULT* pResult){
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (getIsEq()) {
		SetMicEQ(IDC_SLIDER_EQ_5, IDC_EQ5_HZ, IDC_STATIC_EQ5_VALUE, 4);				// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderMicBass(NMHDR* pNMHDR, LRESULT* pResult) {		// MIC低音
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (!getIsEq()) {																// 不是EQ调节
		SetMicEQ(IDC_SLIDER_MIC_BASS, -1, IDC_MIC_BASS, 6);							// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnNMCustomdrawSliderMicTreble(NMHDR* pNMHDR, LRESULT* pResult) {		// MIC高音
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (!getIsEq()) {																// 不是EQ调节
		SetMicEQ(IDC_SLIDER_MIC_TREBLE, -1, IDC_MIC_TREBLE, 7);						// 显示数值
	}
	*pResult = 0;
}

void CPopMic::OnBnClickedRadioEqOpen(){												// EQ调节
	((CButton*)GetDlgItem(IDC_RADIO_EQ_OPEN))->SetCheck(TRUE);
	gMicEqValue[3] &= 0x3f;					// B5:B0保留原数值
	gMicEqValue[3] |= 0x00;					// B7:B6 的B6为0
	gIsClick = true;						// 点击选择EQ调节还是高低音调节的标志

}

void CPopMic::OnBnClickedRadioMicOpen(){											// MIC高低音
	((CButton*)GetDlgItem(IDC_RADIO_MIC_OPEN))->SetCheck(TRUE);
	gMicEqValue[3] &= 0x3f;					// B5:B0保留原数值
	gMicEqValue[3] |= 0x40;					// B7:B6 的B6为1
	gIsClick = true;						// 点击选择EQ调节还是高低音调节的标志

}